package cn.itcast.account.service;

import io.seata.rm.tcc.api.BusinessActionContext;
import io.seata.rm.tcc.api.BusinessActionContextParameter;
import io.seata.rm.tcc.api.LocalTCC;
import io.seata.rm.tcc.api.TwoPhaseBusinessAction;

/**
 * ClassName: AccountTCCService
 * Package: cn.itcast.account.service
 * Description:
 *
 * @Author 梓维李
 * @Create 2023/4/6 13:27
 * @Version 2.0
 */
@LocalTCC
public interface AccountTCCService {

    /*
     * @Description: @TwoPhaseBusinessAction中的name属性要与当前方法名一致,用于指定try逻辑对应的方法
     * @BusinessActionContextParameter用作与confirm和cancel方法之间的参数传递
     */
    @TwoPhaseBusinessAction(name = "deduct",commitMethod = "confirm",rollbackMethod = "cancel")
    void deduct(@BusinessActionContextParameter(paramName = "userId") String userId,
                @BusinessActionContextParameter(paramName = "money") int money);


    /*
     * @Description: 二阶段confirm方法, 用于在try方法中执行完所有操作后,执行confirm方法 可以另命名但要保证与try定义的commitMethod一致
     *               context上下文们可以传递try方法的参数
     */
    boolean confirm(BusinessActionContext context) ;

    /*
     * @Description: 二阶段cancel回滚方法, 用于事务回滚时执行cancel方法 可以另命名 但要保证与try中rollbackMethod定义的一致
     */
    boolean cancel(BusinessActionContext context) ;
}
